package 每日一题;

import java.util.Arrays;

public class No832翻转图像 {

    /**
     * 给定一个二进制矩阵 A，我们想先水平翻转图像，然后反转图像并返回结果。
     * 水平翻转图片就是将图片的每一行都进行翻转，即逆序。例如，水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
     * 反转图片的意思是图片中的 0 全部被 1 替换， 1 全部被 0 替换。例如，反转 [0, 1, 1] 的结果是 [1, 0, 0]。
     *
     * 示例 1：
     * 输入：[[1,1,0],[1,0,1],[0,0,0]]
     * 输出：[[1,0,0],[0,1,0],[1,1,1]]
     * 解释：首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]]；
     *      然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
     * 示例 2：
     * 输入：[[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
     * 输出：[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
     * 解释：首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]；
     *      然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
     *  
     * 提示：
     * 1 <= A.length = A[0].length <= 20
     * 0 <= A[i][j] <= 1
     */

    public int[][] flipAndInvertImage(int[][] A) {

        int allLength=A.length;
        int itemLength=A[0].length;
        int left=0;
        int right=0;
        int mid=itemLength/2;

        if(itemLength%2==0){
            //偶数
            right=mid;
            left=mid-1;
        }else{
            //奇数
            left=mid-1;
            right=mid+1;
            //然后将中间翻转
            for (int i = 0; i < A.length; i++) {
                A[i][mid]=Math.abs(A[i][mid]-1);//|1-1|=0  |0-1|=1
            }
        }
        int tempLeft=left;
        int tempRight=right;

        //看itemLength为 奇数 还是 偶数   0 1 2 3 4 5 6  length=7  7/2=3  奇数正好是中间,先将中间翻转,然后再左右指针,mid-1,mid+1
        //偶数 0 1 2 3 4 5 length=6  6/2=3  位置偏右,3右指针,2就是左指针

        for (int i = 0; i < allLength; i++) {

            while (left>=0){

                int leftNum=A[i][left];
                int rightNum=A[i][right];

                if(leftNum==rightNum){
                    //相等就同时置换
                    A[i][left]=Math.abs(leftNum-1);
                    A[i][right]=A[i][left];
                }//不相等就什么都不做,因为置换后等于没变

                left--;
                right++;

            }
            left=tempLeft;
            right=tempRight;

        }

        return A;
    }

    public static void main(String[] args) {
        No832翻转图像 n=new No832翻转图像();
        int[][] arr={{1,1,0},{1,0,1},{0,0,0}};
        int[][] result = n.flipAndInvertImage(arr);
        System.out.println(Arrays.deepToString(result));
    }

}
